/**
 * 文件名：@AbstractMatchFunctionSecurityProcessor.java <br/>
 * 包名：cn.efunbox.afw.web.security.processor <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.security.processor;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

import cn.efunbox.afw.core.exception.SecurityException;

/**
 * 类名：AbstractMatchFunctionSecurityProcessor  <br />
 *
 * 功能：使用antpath规则进行权限检查
 *
 * @author xtwin <br />
 * 创建时间：2016年8月4日 上午11:42:09  <br />
 * @version 2016年8月4日
 */
public abstract class AbstractMatchFunctionSecurityProcessor extends AbstractFunctionSecurityProcessor {
	
	// 路径匹配工具，默认为AntPathMatcher
	protected PathMatcher pathMatcher = new AntPathMatcher();

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月4日 上午11:42:20<br/>
	 * 
	 * @param wishs
	 * @param request
	 * @param response
	 * @param handler <br/>
	 * @see cn.efunbox.afw.web.security.processor.AbstractFunctionSecurityProcessor#doProcess(java.util.Set, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	@Override
	protected void doProcess(Set<String> wishs, HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		// 取得当前可接受的访问资源
		Set<String> accepted = getAccepted(request, response, handler);
		
		if (null != accepted && ! accepted.isEmpty()) {
			for (String accept : accepted) {
				// 依次检查，直到检查到一个符合条件的为止
				for (String wish : wishs) {
					if (pathMatcher.match(accept, wish)) {
						// 找到有效权限
						return ;
					}
				}
			}
		}
		
		throw new SecurityException("对不起，您没有权限访问资源：" + wishs);
	}
	
	/**
	 * 功能：取得可接受的访问资源 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月4日 上午11:43:59 <br/>
	 */
	protected abstract Set<String> getAccepted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

	/**
	 * @version 2016年8月4日-下午1:37:46
	 */
	public void setPathMatcher(PathMatcher pathMatcher) {
		this.pathMatcher = pathMatcher;
	}
}